package br.com.datasun.biblioteca.ui;

import images.ImageLoader;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.text.MaskFormatter;

import br.com.datasun.biblioteca.business.PessoaFisicaBO;
import br.com.datasun.biblioteca.entities.Cidade;
import br.com.datasun.biblioteca.entities.Estado;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.exceptions.BusinessException;
import br.com.datasun.biblioteca.exceptions.NomeInvalidoException;
import br.com.datasun.biblioteca.ui.components.ClienteTableModel;
import br.com.datasun.biblioteca.ui.components.ControlableUI;
import br.com.datasun.biblioteca.ui.controller.CadastroClienteController;
import br.com.datasun.biblioteca.ui.controller.ICRUDController;
import br.com.datasun.biblioteca.ui.listeners.KeyListenerTamanhoCampo;

public class CadastroClientesUI extends CadastroControllerUI {

	private static final long serialVersionUID = 1L;
	private BorderLayout borderLayout1 = new BorderLayout();
	private JPanel jpTable = new JPanel();
	private JPanel jpTitle = new JPanel();
	private JPanel jpForm = new JPanel();
	private JPanel jpAcesso = new JPanel();
	private JScrollPane jScrollPane1 = new JScrollPane();
	private JTable jtabelaCliente = new JTable();
	private JButton jbLimpar = new JButton();
	private JButton jbPesquisar = new JButton();
	private JButton jbNovo = new JButton();
	private JButton jbFechar = new JButton();
	private JButton jbSalvar = new JButton();
	private JButton jbExcluir = new JButton();
	private BorderLayout borderLayout2 = new BorderLayout();
	private JLabel jlTitle = new JLabel();
	private JPanel jpConteudo = new JPanel();
	private GridBagLayout gridBagLayout2 = new GridBagLayout();
	private JPanel jPanel1 = new JPanel();
	private JPanel jPanel2 = new JPanel();
	private final JLabel lblLogradouro = new JLabel("Logradouro");
	private final JTextField jtfLogradouro = new JTextField();
	private final JLabel lblNumero = new JLabel("N\u00FAmero");
	private final JTextField jtfNumero = new JTextField();
	private final JLabel lblComplemento = new JLabel("Complemento");
	private final JTextField jtfComplemento = new JTextField();
	private final JTextField jtfBairro = new JTextField();
	private final JLabel lblEstado = new JLabel("Estado");
	private final JComboBox jcbEstado = new JComboBox();
	private final JLabel lblCidade = new JLabel("Cidade");
	private final JComboBox jcbCidade = new JComboBox();
	private final JLabel lblCEP = new JLabel("CEP");
	private final JTextField jtfCEP = new JTextField();
	private final JTextField jtfNome = new JTextField();
	private final JLabel lblNome = new JLabel("Nome");
	private final JLabel lblBairro = new JLabel("Bairro");
	private final JLabel lblEmail = new JLabel("Email");
	private final JTextField jtfEmail = new JTextField();
	private final JLabel lblCpf = new JLabel("CPF");
	private final JLabel lblRg = new JLabel("RG");
	private final JFormattedTextField jtfCPF = new JFormattedTextField();
	private final JTextField jtfRG = new JTextField();
	private final JLabel lblDataNasc = new JLabel("Data Nasc.");
	private final JFormattedTextField jtfDataNascimento = new JFormattedTextField();
	private final JLabel lblTelefone = new JLabel("Telefone");
	private final JTextField jtfTelefone = new JTextField();
	private final JLabel lblCelular = new JLabel("Celular");
	private final JTextField textField_5 = new JTextField();
	private final JTextField jtfCelular = new JTextField();
	private MaskFormatter dateMaskFormater;
	private MaskFormatter cpfMaskFormater;
	private PessoaFisicaBO pessoaFisicaBO = new PessoaFisicaBO();
	private ClienteTableModel model;
	private PessoaFisica clienteSelecionado;
	private PessoaFisica clienteEmEdicao;

	private final JButton jbAcesso= new JButton("");
	private final Color COR_FUNDO_ERRO = new Color(255,185,185);
	private final Color COR_FUNDO_NORMAL =  Color.WHITE;
	private final Color COR_FUNDO_REQUERIDO = new Color(255, 255, 204);
	
	private boolean isEditing = false; //Determina se o registro est� em edi��o
	public boolean isEditing(){
		return this.isEditing;
	}
	
	public void setIsEditing(boolean isEditing){
		this.isEditing = isEditing;
	}
	
    private List<Estado> estados;
	
	private ICRUDController controller;
	
	public String getNomeCliente(){
		String resultado = jtfNome.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public String getEmail(){
		String resultado = jtfEmail.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		return resultado;
	}
	
	public String getCPF() {
		String resultado = jtfCPF.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		return resultado;
	}
	
	public String getRG() {
		String resultado = jtfRG.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		return resultado;
	}
	
	public Date getDataNascimento() {
		Date resultado = formataData(jtfDataNascimento.getText());
		return resultado;
	}
	
	
	public String getTelefone(){
		String resultado = jtfTelefone.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		return resultado;
	}

	public String getCelular(){
		String resultado = jtfCelular.getText();
		if (resultado != null ){
			resultado = resultado.trim();
		}
		return resultado;
	}
	
		
	public String getLogradouro(){
		String resultado = jtfLogradouro.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public String getNumero(){
		String resultado = jtfNumero.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public String getComplemento(){
		String resultado = jtfComplemento.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public String getBairro(){
		String resultado = jtfBairro.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public Cidade getCidadeSelecionada(){
		Cidade resultado = null;
		if (jcbCidade.getSelectedIndex() != -1){
			resultado = (Cidade) jcbCidade.getSelectedItem();
		}
		return resultado;
	}
	
	public String getCEP(){
		String resultado = jtfCEP.getText();
		if (resultado != null){
			resultado = resultado.trim();
		}
		
		return resultado;
	}
	
	public Estado getEstadoSelecionado(){
		Estado resultado = null;
		if (jcbEstado.getSelectedIndex() != -1){
			resultado = (Estado) jcbEstado.getSelectedItem();
		}
		return resultado;
	}	

	public CadastroClientesUI() {
		jtfCelular.setColumns(10);
		textField_5.setColumns(10);
		jtfTelefone.setColumns(10);
		jtfDataNascimento.setColumns(10);
		jtfRG.setColumns(16);
		jtfCPF.setColumns(16);
		jtfEmail.setColumns(40);
		jtfNome.setColumns(40);
		jtfCEP.setColumns(10);
		jtfBairro.setColumns(10);
		jtfComplemento.setColumns(10);
		jtfNumero.setColumns(10);
		jtfLogradouro.setColumns(10);
		try {
			Inicializar();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	private void Inicializar() throws Exception {

		this.setLayout(borderLayout1);
		this.setSize(new Dimension(1024, 534));
		jpTable.setPreferredSize(new Dimension(10, 250));
		jpAcesso.setPreferredSize(new Dimension(80, 230));
		jpTitle.setPreferredSize(new Dimension(10, 250));
		jpTitle.setLayout(borderLayout2);
		jpForm.setPreferredSize(new Dimension(700, 30));
		jScrollPane1.setPreferredSize(new Dimension(900, 230));
		
		jtabelaCliente.setColumnModel(new DefaultTableColumnModel());
		jbLimpar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				jbLimpar_actionPerformed(e);
			}
		});
		jScrollPane1.setViewportView(jtabelaCliente);
		jpTable.add(jScrollPane1, BorderLayout.CENTER);
		
		jpTable.add(jpAcesso, BorderLayout.WEST);
		jpAcesso.add(jbAcesso, null);
		jbAcesso.setPreferredSize(new Dimension(80, 65));
		jbAcesso.setIcon(ImageLoader.createImageIcon("btnAcessoSenha_80x65.png"));
		this.add(jpTable, BorderLayout.SOUTH);

		jpTitle.add(jlTitle, BorderLayout.NORTH);
		jpTitle.add(jpConteudo, BorderLayout.CENTER);
		jpTitle.add(jPanel1, BorderLayout.EAST);
		jpTitle.add(jPanel2, BorderLayout.WEST);
		this.add(jpTitle, BorderLayout.NORTH);
		this.add(jpForm, BorderLayout.CENTER);
		jpForm.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
		jpForm.add(jbLimpar);
		jpForm.add(jbNovo);
		jpForm.add(jbFechar);
		jpForm.add(jbExcluir);
		jpForm.add(jbPesquisar);
		jpForm.add(jbSalvar);
		model = new ClienteTableModel();

		jtabelaCliente.setModel(model);
		
		jlTitle.setText("Cadastro de Clientes");
		jlTitle.setHorizontalAlignment(SwingConstants.CENTER);
		jlTitle.setPreferredSize(new Dimension(100, 20));
		gridBagLayout2.columnWeights = new double[]{0.0, 1.0, 0.0, 1.0};
		jpConteudo.setLayout(gridBagLayout2);
		jpConteudo.setPreferredSize(new Dimension(0, 60));

		GridBagConstraints gbc_lblNome = new GridBagConstraints();
		gbc_lblNome.insets = new Insets(0, 0, 5, 5);
		gbc_lblNome.anchor = GridBagConstraints.EAST;
		gbc_lblNome.gridx = 0;
		gbc_lblNome.gridy = 0;
		lblNome.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblNome, gbc_lblNome);

		GridBagConstraints gbc_textField_5 = new GridBagConstraints();
		gbc_textField_5.anchor = GridBagConstraints.WEST;
		gbc_textField_5.gridwidth = 3;
		gbc_textField_5.insets = new Insets(0, 0, 5, 0);
		gbc_textField_5.gridx = 1;
		gbc_textField_5.gridy = 0;
		jpConteudo.add(jtfNome, gbc_textField_5);

		GridBagConstraints gbc_lblEmail = new GridBagConstraints();
		gbc_lblEmail.anchor = GridBagConstraints.EAST;
		gbc_lblEmail.insets = new Insets(0, 0, 5, 5);
		gbc_lblEmail.gridx = 0;
		gbc_lblEmail.gridy = 1;
		lblEmail.setFont(new Font("Tahoma", Font.BOLD, 11));
		lblEmail.setHorizontalAlignment(SwingConstants.RIGHT);
		jpConteudo.add(lblEmail, gbc_lblEmail);

		GridBagConstraints gbc_jtfEmail = new GridBagConstraints();
		gbc_jtfEmail.anchor = GridBagConstraints.WEST;
		gbc_jtfEmail.gridwidth = 3;
		gbc_jtfEmail.insets = new Insets(0, 0, 5, 0);
		gbc_jtfEmail.gridx = 1;
		gbc_jtfEmail.gridy = 1;
		jpConteudo.add(jtfEmail, gbc_jtfEmail);

		GridBagConstraints gbc_lblCpf = new GridBagConstraints();
		gbc_lblCpf.anchor = GridBagConstraints.EAST;
		gbc_lblCpf.insets = new Insets(0, 0, 5, 5);
		gbc_lblCpf.gridx = 0;
		gbc_lblCpf.gridy = 2;
		lblCpf.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblCpf, gbc_lblCpf);

		GridBagConstraints gbc_textField_1 = new GridBagConstraints();
		gbc_textField_1.anchor = GridBagConstraints.WEST;
		gbc_textField_1.insets = new Insets(0, 0, 5, 5);
		gbc_textField_1.gridx = 1;
		gbc_textField_1.gridy = 2;
		jpConteudo.add(jtfCPF, gbc_textField_1);

		GridBagConstraints gbc_lblRg = new GridBagConstraints();
		gbc_lblRg.anchor = GridBagConstraints.EAST;
		gbc_lblRg.insets = new Insets(0, 0, 5, 5);
		gbc_lblRg.gridx = 2;
		gbc_lblRg.gridy = 2;
		lblRg.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblRg, gbc_lblRg);

		GridBagConstraints gbc_jtfRG = new GridBagConstraints();
		gbc_jtfRG.anchor = GridBagConstraints.WEST;
		gbc_jtfRG.insets = new Insets(0, 0, 5, 0);
		gbc_jtfRG.gridx = 3;
		gbc_jtfRG.gridy = 2;
		jpConteudo.add(jtfRG, gbc_jtfRG);

		GridBagConstraints gbc_lblDataNasc = new GridBagConstraints();
		gbc_lblDataNasc.anchor = GridBagConstraints.EAST;
		gbc_lblDataNasc.insets = new Insets(0, 0, 5, 5);
		gbc_lblDataNasc.gridx = 0;
		gbc_lblDataNasc.gridy = 3;
		lblDataNasc.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblDataNasc, gbc_lblDataNasc);

		GridBagConstraints gbc_jtfDataNascimento = new GridBagConstraints();
		gbc_jtfDataNascimento.anchor = GridBagConstraints.WEST;
		gbc_jtfDataNascimento.insets = new Insets(0, 0, 5, 5);
		gbc_jtfDataNascimento.gridx = 1;
		gbc_jtfDataNascimento.gridy = 3;
		jpConteudo.add(jtfDataNascimento, gbc_jtfDataNascimento);

		GridBagConstraints gbc_lblTelefone = new GridBagConstraints();
		gbc_lblTelefone.anchor = GridBagConstraints.EAST;
		gbc_lblTelefone.insets = new Insets(0, 0, 5, 5);
		gbc_lblTelefone.gridx = 0;
		gbc_lblTelefone.gridy = 4;
		lblTelefone.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblTelefone, gbc_lblTelefone);

		GridBagConstraints gbc_jtfTelefone = new GridBagConstraints();
		gbc_jtfTelefone.anchor = GridBagConstraints.WEST;
		gbc_jtfTelefone.insets = new Insets(0, 0, 5, 5);
		gbc_jtfTelefone.gridx = 1;
		gbc_jtfTelefone.gridy = 4;
		jpConteudo.add(jtfTelefone, gbc_jtfTelefone);

		GridBagConstraints gbc_lblCelular = new GridBagConstraints();
		gbc_lblCelular.anchor = GridBagConstraints.EAST;
		gbc_lblCelular.insets = new Insets(0, 0, 5, 5);
		gbc_lblCelular.gridx = 2;
		gbc_lblCelular.gridy = 4;
		lblCelular.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblCelular, gbc_lblCelular);

		GridBagConstraints gbc_jtfCelular = new GridBagConstraints();
		gbc_jtfCelular.anchor = GridBagConstraints.WEST;
		gbc_jtfCelular.insets = new Insets(0, 0, 5, 0);
		gbc_jtfCelular.gridx = 3;
		gbc_jtfCelular.gridy = 4;
		jpConteudo.add(jtfCelular, gbc_jtfCelular);

		GridBagConstraints gbc_lblNewLabel_4 = new GridBagConstraints();
		gbc_lblNewLabel_4.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_4.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_4.gridx = 0;
		gbc_lblNewLabel_4.gridy = 5;
		jpConteudo.add(lblCEP, gbc_lblNewLabel_4);
		lblCEP.setFont(new Font("Tahoma", 1, 11));
		jpConteudo.add(jtfCEP, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
				new Insets(0, 0, 5, 5), 0, 0));
		jtfCEP.setPreferredSize(new Dimension(200, 19));

		GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
		gbc_lblNewLabel.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel.gridx = 0;
		gbc_lblNewLabel.gridy = 6;
		jpConteudo.add(lblLogradouro, gbc_lblNewLabel);
		jpConteudo.add(jtfLogradouro, new GridBagConstraints(1, 6, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
				new Insets(0, 0, 5, 5), 0, 0));

		GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
		gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_1.gridx = 2;
		gbc_lblNewLabel_1.gridy = 6;
		jpConteudo.add(lblNumero, gbc_lblNewLabel_1);


		jpConteudo.add(jtfNumero, new GridBagConstraints(3, 6, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
				new Insets(0, 0, 5, 0), 0, 0));

		GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
		gbc_lblNewLabel_2.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel_2.gridx = 0;
		gbc_lblNewLabel_2.gridy = 7;
		jpConteudo.add(lblComplemento, gbc_lblNewLabel_2);


		jpConteudo.add(jtfComplemento, new GridBagConstraints(1, 7, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
				new Insets(0, 0, 5, 5), 0, 0));

		GridBagConstraints gbc_lblBairro = new GridBagConstraints();
		gbc_lblBairro.insets = new Insets(0, 0, 5, 5);
		gbc_lblBairro.anchor = GridBagConstraints.EAST;
		gbc_lblBairro.gridx = 2;
		gbc_lblBairro.gridy = 7;
		lblBairro.setFont(new Font("Tahoma", Font.BOLD, 11));
		jpConteudo.add(lblBairro, gbc_lblBairro);

		GridBagConstraints gbc_textFieldBairro = new GridBagConstraints();
		gbc_textFieldBairro.anchor = GridBagConstraints.WEST;
		gbc_textFieldBairro.insets = new Insets(0, 0, 5, 0);
		gbc_textFieldBairro.gridx = 3;
		gbc_textFieldBairro.gridy = 7;
		jpConteudo.add(jtfBairro, gbc_textFieldBairro);

		GridBagConstraints gbc_lblNewLabel_3 = new GridBagConstraints();
		gbc_lblNewLabel_3.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel_3.insets = new Insets(0, 0, 0, 5);
		gbc_lblNewLabel_3.gridx = 0;
		gbc_lblNewLabel_3.gridy = 8;
		jpConteudo.add(lblEstado, gbc_lblNewLabel_3);

		GridBagConstraints gbc_comboBox = new GridBagConstraints();
		gbc_comboBox.insets = new Insets(0, 0, 5, 5);
		gbc_comboBox.gridx = 1;
		gbc_comboBox.gridy = 3;
		jpConteudo.add(jcbEstado, new GridBagConstraints(1, 8, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
				new Insets(0, 0, 0, 5), 0, 0));

		GridBagConstraints gbc_lblCidade = new GridBagConstraints();
		gbc_lblCidade.anchor = GridBagConstraints.EAST;
		gbc_lblCidade.insets = new Insets(0, 0, 0, 5);
		gbc_lblCidade.gridx = 2;
		gbc_lblCidade.gridy = 8;
		jpConteudo.add(lblCidade, gbc_lblCidade);

		GridBagConstraints gbc_comboBox_1 = new GridBagConstraints();
		gbc_comboBox_1.fill = GridBagConstraints.HORIZONTAL;
		gbc_comboBox_1.gridx = 3;
		gbc_comboBox_1.gridy = 8;
		jpConteudo.add(jcbCidade, gbc_comboBox_1);


		jPanel1.setSize(new Dimension(10, 10));
		jPanel1.setPreferredSize(new Dimension(200, 10));
		jPanel2.setPreferredSize(new Dimension(200, 10));

		//imagens botoes
		lblLogradouro.setFont(new Font("Tahoma", 1, 11));
		lblNumero.setFont(new Font("Tahoma", 1, 11));
		jtfNumero.setPreferredSize(new Dimension(50, 19));
		lblComplemento.setFont(new Font("Tahoma", 1, 11));
		jtfComplemento.setPreferredSize(new Dimension(100, 19));
		lblEstado.setFont(new Font("Tahoma", 1, 11));
		jcbEstado.setPreferredSize(new Dimension(200, 21));
		lblCidade.setFont(new Font("Tahoma", 1, 11));
		jbNovo.setPreferredSize(new Dimension(115, 25));
		jbSalvar.setPreferredSize(new Dimension(115, 25));
		jbFechar.setPreferredSize(new Dimension(115, 25));
		jbExcluir.setPreferredSize(new Dimension(115, 25));
		jbLimpar.setPreferredSize(new Dimension(115, 25));
		jbPesquisar.setPreferredSize(new Dimension(115, 25));

		jbNovo.setIcon(ImageLoader.createImageIcon("btnNovo115x25.png"));
		jbFechar.setIcon(ImageLoader.createImageIcon("btnFechar115x25.png"));
		jbSalvar.setIcon(ImageLoader.createImageIcon("btnSalvar115x25.png"));
		jbLimpar.setIcon(ImageLoader.createImageIcon("btnLimpar115x25.png"));
		jbPesquisar.setIcon(ImageLoader.createImageIcon("btnPesquisar115x25.png"));
		jbExcluir.setIcon(ImageLoader.createImageIcon("btnExcluir115x25.png"));

		dateMaskFormater = new MaskFormatter("##/##/####");
		dateMaskFormater.setPlaceholderCharacter('_');
		dateMaskFormater.install(jtfDataNascimento);

		cpfMaskFormater = new MaskFormatter("###.###.###-##");
		cpfMaskFormater.setPlaceholderCharacter('_');
		cpfMaskFormater.install(jtfCPF);

		controller = new CadastroClienteController(this);
		controller.carregarDados();		
		
		setTamanhoMaximoCampos();
		limparFormulario();
		editarCampos(false);
		
		jcbEstado.addItemListener(new ItemListener() {
			
			@Override
			public void itemStateChanged(ItemEvent arg0) {
				Estado estadoSelecionado = new Estado();
				estadoSelecionado = (Estado) arg0.getItem();
				carregarCidadesEstado(estadoSelecionado);				
			}
		});
		
		//trata o evento de duplo click para edi��o
		jtabelaCliente.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				controller.selecionarParaEdicaoEventHandler(arg0);
			}
		});
		jtabelaCliente.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent arg0) {
				char tecla = arg0.getKeyChar();
				if(tecla == KeyEvent.VK_DELETE){
					controller.excluirEventHandler();
				}
			}
		});
		

		Dimension dimensionBotoes = new Dimension(115,25);
		jbLimpar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				jbLimpar_actionPerformed(e);
			}
		});
		jbLimpar.setPreferredSize(dimensionBotoes);
		jbNovo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.btnNovoEventHandler();				
			}
		});
		jbNovo.setPreferredSize(dimensionBotoes);
		jbFechar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {				
				controller.btnFecharEventHandler();
			}
		});
		jbFechar.setPreferredSize(dimensionBotoes);
		jbSalvar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.btnSalvarEventHandler();
			}
		});
		jbSalvar.setPreferredSize(dimensionBotoes);
		jbExcluir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				controller.excluirEventHandler();
			}
		});	
		
		jbAcesso.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				CadastroClienteController ct = (CadastroClienteController) controller;
				ct.btnAcessoEventHandler();
			}
		});
	}

	public void limparFormulario(){
		jtfNome.setText("");
		jtfEmail.setText("");
		jtfCPF.setText("");
		jtfRG.setText("");
		jtfDataNascimento.setText("");
		jtfTelefone.setText("");
		jtfCelular.setText("");
		jtfCEP.setText("");
		jtfLogradouro.setText("");
		jtfNumero.setText("");
		jtfComplemento.setText("");
		jtfBairro.setText("");
		jcbEstado.setSelectedIndex(-1);
		jcbCidade.setSelectedIndex(-1);
	}
	
	public void editarCampos(boolean editar){
		
		jtfNome.setEditable(editar);
		jtfEmail.setEditable(editar);
		jtfCPF.setEditable(editar);
		jtfRG.setEditable(editar);
		jtfDataNascimento.setEditable(editar);
		jtfTelefone.setEditable(editar);
		jtfCelular.setEditable(editar);
		jtfCEP.setEditable(editar);
		jtfLogradouro.setEditable(editar);
		jtfNumero.setEditable(editar);
		jtfComplemento.setEditable(editar);
		jtfBairro.setEditable(editar);		
		
		jbLimpar.setEnabled(editar);
		jbNovo.setEnabled(!editar);
		jbFechar.setEnabled(true);
		jbExcluir.setEnabled(!editar);
		jbSalvar.setEnabled(editar);
		
		jcbCidade.setEnabled(editar);
		jcbEstado.setEnabled(editar);
		
		if (!editar){
			jtfNome.setBackground(null);
			jtfEmail.setBackground(null);
			jtfCPF.setBackground(null);
			jtfRG.setBackground(null);
			jtfDataNascimento.setBackground(null);
			jtfTelefone.setBackground(null);
			jtfCelular.setBackground(null);
			jtfCEP.setBackground(null);
			jtfLogradouro.setBackground(null);
			jtfNumero.setBackground(null);	
			jcbCidade.setBackground(null);
			jcbEstado.setBackground(null);
		}
		
		jtabelaCliente.setEnabled(!editar);
		
		
		
	}
	
	private void jbLimpar_actionPerformed(ActionEvent e) {
		controller.btnLimparEventHandler();
	}
	
	public void carregarFormularioAPartirDe(PessoaFisica clienteAExibir){
		if(clienteAExibir!= null){
			jtfNome.setText(clienteAExibir.getNome());
			jtfEmail.setText(clienteAExibir.getEmail());
			if (clienteAExibir.getCPF() != null){
				jtfCPF.setText(clienteAExibir.getCPF().getNumero());
			}else{
				jtfCPF.setText("");
			}
			
			if (clienteAExibir.getRG() != null){
				jtfRG.setText(clienteAExibir.getRG().getNumero());
			}else{
				jtfRG.setText("");
			}
			
			Date dataNascimento;
			dataNascimento = clienteAExibir.getDataNascimento();
			
			SimpleDateFormat sdf = new SimpleDateFormat ("dd/MM/yyyy");  
			jtfDataNascimento.setText(sdf.format(dataNascimento).toString());					
			
			if (clienteAExibir.getTelefone() != null){
				jtfTelefone.setText(clienteAExibir.getTelefone().getNrContato());
			}else{
				jtfTelefone.setText("");
			}
			
			if (clienteAExibir.getCelular() != null){
				jtfCelular.setText(clienteAExibir.getCelular().getNrContato());
			}else{
				jtfCelular.setText("");
			}
			
			jtfLogradouro.setText(clienteAExibir.getEndereco().getNmLogradouro());
			jtfNumero.setText(clienteAExibir.getEndereco().getNumero());
			jtfComplemento.setText(clienteAExibir.getEndereco().getComplemento());
			jtfBairro.setText(clienteAExibir.getEndereco().getBairro());
			
			Estado estadoCliente = clienteAExibir.getEndereco().getCidade().getEstado();
			if (estadoCliente != null){
				jcbEstado.setSelectedItem(estadoCliente);
				jcbCidade.setSelectedItem(clienteAExibir.getEndereco().getCidade());				
			}
			
			jtfCEP.setText(clienteAExibir.getEndereco().getCep());
		}
	}
	
	public void carregarCidadesEstado(Estado estadoSelecionado){
		List<Cidade> cidades = estadoSelecionado.getCidade();
		jcbCidade.removeAllItems();
		for (Cidade cidade : cidades){
			jcbCidade.addItem(cidade);
		}
	}
	
	public void inicializarComboEstados(){
	   for(Estado estado : estados){
	      jcbEstado.addItem(estado);
	   }
			
	   Estado estadoSelecionado = new Estado();
	   estadoSelecionado = (Estado) jcbEstado.getSelectedItem();
	   carregarCidadesEstado(estadoSelecionado);				
	}
	
	private void setTamanhoMaximoCampos(){
		jtfNome.addKeyListener(new KeyListenerTamanhoCampo(jtfNome, 255));
		jtfEmail.addKeyListener(new KeyListenerTamanhoCampo(jtfEmail, 255));
		jtfLogradouro.addKeyListener(new KeyListenerTamanhoCampo(jtfLogradouro, 255));
		jtfNumero.addKeyListener(new KeyListenerTamanhoCampo(jtfNumero, 12));
		jtfComplemento.addKeyListener(new KeyListenerTamanhoCampo(jtfComplemento, 100));
		jtfBairro.addKeyListener(new KeyListenerTamanhoCampo(jtfBairro, 255));
		jtfCEP.addKeyListener(new KeyListenerTamanhoCampo(jtfCEP, 9));
	}
	
	public void mudarCorCampoObrigatorioNome(){
		jtfNome.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoNomeCliente(){
		jtfNome.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioLogradouro(){
		jtfLogradouro.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoLogradouro(){
		jtfLogradouro.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioNumero(){
		jtfNumero.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoNumero(){
		jtfNumero.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioCidade(){
		jcbCidade.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoCidade(){
		jcbCidade.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioEstado(){
		jcbEstado.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoEstado(){
		jcbEstado.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioCep(){
		jtfCEP.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoCep(){
		jtfCEP.requestFocus();
	}
	
	public void mudarCorCampoObrigatorioBairro(){
		jtfBairro.setBackground(this.COR_FUNDO_REQUERIDO);
	}
	
	public void requestFocusCampoBairro(){
		jtfBairro.requestFocus();
	}
	
	public void limparCorCamposObrigatorios(){
		jtfNome.setBackground(null);
		jtfLogradouro.setBackground(null);
		jtfNumero.setBackground(null);	
		jcbCidade.setBackground(null);
		jcbEstado.setBackground(null);
	}
	
	public void atualizarCliente(PessoaFisica cliente){
		this.model.atualizarPessoaFisica(cliente);
	}
	
	public void atualizarCliente(PessoaFisica cliente, int indiceClienteSelecionado){
		this.model.atualizarPessoaFisica(cliente,indiceClienteSelecionado);
	}
	
	public void inserirCliente(PessoaFisica cliente){
		this.model.inserir(cliente);
	}
		
	public int getIndiceClienteSelecionado() {
		return jtabelaCliente.getSelectedRow();
	}
	
	public void setClienteSelecionado(PessoaFisica clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public PessoaFisica getClienteSelecionado() {
		return clienteSelecionado;
	}
	
	public PessoaFisica getClienteEmEdicao() {
		return clienteEmEdicao;
	}

	public void setClienteEmEdicao(PessoaFisica clienteEmEdicao) {
		this.clienteEmEdicao = clienteEmEdicao;
	}

	public void setEstados(List<Estado> estados) {
		this.estados = estados;
	}

	public List<Estado> getEstados() {
		return estados;
	}
	
	public void removerCliente(PessoaFisica cliente){
		model.remover(cliente);
	}
	
	public PessoaFisica getCliente(int linhaSelecionada){
		return model.getPessoaFisicaDe(linhaSelecionada);
	}
	
	public void setClientes(List<PessoaFisica> clientes){
		this.model.setPessoasFisicas(clientes);
	}

	 public static Date formataData(String data)  {   
	        if (data == null || data.equals(""))  
	            return null;  
	          
	        Date date = null;  
	        try {  
	        	SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
	           // date = (java.sql.Date)formatter.parse(data);  
	            date = formatter.parse(data);
	        } catch (ParseException e) {              
					e.printStackTrace();
	        }  
	        return date;  
	    }  		

}
